#!/bin/bash

# 服务终止脚本
# 用于终止所有由 launch_all_services.sh 启动的 screen 会话

# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${BLUE}======================================${NC}"
echo -e "${BLUE}    ROS 服务批量终止器${NC}"
echo -e "${BLUE}======================================${NC}"

# 检查screen是否安装
if ! command -v screen &> /dev/null; then
    echo -e "${RED}错误：screen未安装！${NC}"
    echo -e "${YELLOW}请安装screen：${NC}"
    echo "sudo apt-get install screen"
    exit 1
fi

echo -e "${GREEN}✓ screen已安装${NC}"

# 函数：获取所有服务相关的screen会话
get_service_sessions() {
    screen -list 2>/dev/null | grep -E "service_" | awk '{print $1}' | cut -d'.' -f1
}

# 函数：显示当前运行的服务会话
show_running_sessions() {
    echo -e "${BLUE}正在检查运行中的服务会话...${NC}"
    
    local sessions=$(get_service_sessions)
    
    if [ -z "$sessions" ]; then
        echo -e "${YELLOW}没有找到正在运行的服务screen会话${NC}"
        return 1
    else
        echo -e "${GREEN}找到以下服务screen会话：${NC}"
        echo "$sessions" | while read session; do
            if [ -n "$session" ]; then
                # 获取会话的详细信息
                local session_info=$(screen -list 2>/dev/null | grep "$session")
                echo -e "  ${YELLOW}$session${NC} - $session_info"
            fi
        done
        return 0
    fi
}

# 函数：终止所有服务会话
kill_all_service_sessions() {
    local sessions=$(get_service_sessions)
    local killed_count=0
    local failed_count=0
    
    if [ -z "$sessions" ]; then
        echo -e "${YELLOW}没有找到需要终止的服务会话${NC}"
        return 0
    fi
    
    echo -e "${BLUE}开始终止服务会话...${NC}"
    echo ""
    
    echo "$sessions" | while read session; do
        if [ -n "$session" ]; then
            echo -e "正在终止会话: ${YELLOW}$session${NC}"
            
            # 尝试优雅地终止会话
            if screen -S "$session" -X quit 2>/dev/null; then
                echo -e "  ${GREEN}✓ 成功终止会话 $session${NC}"
                killed_count=$((killed_count + 1))
            else
                echo -e "  ${RED}✗ 终止会话 $session 失败${NC}"
                failed_count=$((failed_count + 1))
                
                # 如果优雅终止失败，尝试强制终止
                echo -e "  ${YELLOW}尝试强制终止...${NC}"
                if screen -S "$session" -X kill 2>/dev/null; then
                    echo -e "  ${GREEN}✓ 强制终止成功${NC}"
                    killed_count=$((killed_count + 1))
                    failed_count=$((failed_count - 1))
                else
                    echo -e "  ${RED}✗ 强制终止也失败${NC}"
                fi
            fi
            
            # 短暂等待，确保会话完全终止
            sleep 0.5
        fi
    done
    
    # 由于在子shell中运行，需要重新计算
    local final_sessions=$(get_service_sessions)
    if [ -z "$final_sessions" ]; then
        echo -e "${GREEN}所有服务会话已成功终止${NC}"
    else
        echo -e "${YELLOW}仍有一些会话未能终止：${NC}"
        echo "$final_sessions"
    fi
}

# 函数：使用Python脚本终止（备用方法）
kill_using_python() {
    echo -e "${BLUE}使用Python脚本终止服务会话...${NC}"
    python3 "$SCRIPT_DIR/scripts/batch_service_launcher.py" -k
}

# 主逻辑
main() {
    # 解析命令行参数
    FORCE_MODE=false
    USE_PYTHON=false
    SHOW_ONLY=false
    
    while [[ $# -gt 0 ]]; do
        case $1 in
            -f|--force)
                FORCE_MODE=true
                shift
                ;;
            -p|--python)
                USE_PYTHON=true
                shift
                ;;
            -l|--list)
                SHOW_ONLY=true
                shift
                ;;
            -h|--help)
                echo "用法: $0 [选项]"
                echo ""
                echo "选项:"
                echo "  -f, --force    强制模式，不询问确认"
                echo "  -p, --python   使用Python脚本终止（备用方法）"
                echo "  -l, --list     仅显示运行中的会话，不终止"
                echo "  -h, --help     显示此帮助信息"
                echo ""
                echo "示例:"
                echo "  $0              # 交互式终止所有服务会话"
                echo "  $0 -f           # 强制终止所有服务会话"
                echo "  $0 -l           # 仅列出运行中的会话"
                echo "  $0 -p           # 使用Python脚本终止"
                exit 0
                ;;
            *)
                echo -e "${RED}未知参数: $1${NC}"
                echo "使用 -h 或 --help 查看帮助"
                exit 1
                ;;
        esac
    done
    
    # 显示当前运行的会话
    if ! show_running_sessions; then
        echo ""
        echo -e "${GREEN}没有需要终止的服务会话${NC}"
        exit 0
    fi
    
    # 如果只是查看模式，直接退出
    if [ "$SHOW_ONLY" = true ]; then
        exit 0
    fi
    
    echo ""
    
    # 如果使用Python方法
    if [ "$USE_PYTHON" = true ]; then
        if [ "$FORCE_MODE" = false ]; then
            read -p "确认使用Python脚本终止所有服务会话？(y/N): " -n 1 -r
            echo
            if [[ ! $REPLY =~ ^[Yy]$ ]]; then
                echo "已取消操作"
                exit 0
            fi
        fi
        kill_using_python
        exit $?
    fi
    
    # 确认操作（除非是强制模式）
    if [ "$FORCE_MODE" = false ]; then
        echo -e "${YELLOW}警告：这将终止所有服务相关的screen会话！${NC}"
        read -p "确认继续？(y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            echo "已取消操作"
            exit 0
        fi
    fi
    
    # 执行终止操作
    kill_all_service_sessions
    
    echo ""
    echo -e "${BLUE}======================================${NC}"
    echo -e "${BLUE}    终止操作完成${NC}"
    echo -e "${BLUE}======================================${NC}"
    echo ""
    
    # 最终检查
    echo -e "${BLUE}最终检查...${NC}"
    if ! show_running_sessions; then
        echo -e "${GREEN}✓ 所有服务会话已成功终止${NC}"
    else
        echo -e "${YELLOW}⚠ 仍有一些会话在运行，可能需要手动处理${NC}"
        echo -e "${YELLOW}提示：可以尝试使用 -p 参数使用Python脚本终止${NC}"
    fi
}

# 运行主函数
main "$@" 